有了載具發票之後,可以透過發票號碼、消費日期、載具條碼、載具驗證碼來查詢發票購買細項
通常這邊發票會很多(因為一個月通常會有很多發票),例如我昨天在發票表頭 API get_carrier_invoices_header
是一次抓去一個月份的發票,也因此我已經有大量的發票載具
像是我在今年五月總共有 24 張發票存在載具,因此一次會抓回 24 張。這時候非同步的方式會發揮威力,就不用一張一張等,舉裡可以一次丟 10 個 request。
@classmethod
@handle_exceptions
async def get_carrier_invoices_detail(cls):
"""
載具 - 載具發票詳細查詢
"""
data_dao = DataDao()
conn = data_dao.conn
query = {
"tag": "invoice_carrier",
"data.gov.status": "審查中",
}
invoices = await conn.find_all_async(query)
logging.info("本次可更新發票張數為: {} 張".format(len(invoices)))
await cls.process_chunks_with_semaphore(invoices, cls.process_carrier_invoice_detail, conn)
conn.close()
我們先透過 carrier_id 取得這張載具條碼和驗證碼
carrier_query = {"_id": ObjectId(my_inv["carrier_id"])}
carrier = conn.find_one(carrier_query)
接著就可以查詢載具細項 get_carrier_invoices_detail
而回傳的資訊做不同的處理與之前大同小異,詳細參考下方程式碼
try:
# format invDate
invDate = cls.date_format(my_inv["response"]["invDate"])
# call API
response = await asyncio.to_thread(
twi.get_carrier_invoices_detail,
CARD_TYPE,
carrier["data"]["card_no"],
my_inv["response"]["invNum"],
invDate,
decrypt_with_salt(carrier["data"]["card_encrypt"])
)
logging.info("response:{}".format(response))
except APIError as e:
error_msg = str(e)
error_code = error_msg.split()[0].strip('<>')
error_msg = ' '.join(error_msg.split()[1:])
if error_msg=="參數驗證碼錯誤":
update_carrier_data = {
"updated_timestamp": datetime.now(tz),
"data.gov.status": "載具失效",
"data.gov.gov_status": "[載具詳細]排程執行成功",
"data.gov.error_msg": str(error_code) + str(error_msg),
}
update_invoice_data = {
"updated_timestamp": datetime.now(tz),
"data.gov.status": "載具失效",
"data.gov.gov_status": "排程執行成功",
"data.gov.error_msg": str(error_code) + str(error_msg),
}
conn.update_one(update_carrier_data)
else:
update_invoice_data = {
"updated_timestamp": datetime.now(tz),
"data.gov.status": "審查中",
"data.gov.gov_status": "排程執行失敗",
"data.gov.error_msg": str(error_code) + str(error_msg),
}
except JSONDecodeError:
update_invoice_data = {
"updated_timestamp": datetime.now(tz),
"data.gov.status": "審查中",
"data.gov.gov_status": "排程執行失敗",
"data.gov.error_msg": "JSONDecodeError",
}
except Exception as e:
update_invoice_data = {
"updated_timestamp": datetime.now(tz),
"data.gov.status": "審查中",
"data.gov.gov_status": "排程執行失敗",
"data.gov.error_msg": str(e),
}
else:
details = response["details"]
if not "details" in response:
update_invoice_data = {
"updated_timestamp": datetime.now(tz),
"data.gov.status": "資料異常",
"data.gov.gov_status": "排程執行成功",
"data.gov.error_msg": "沒有 detail",
}
else:
update_invoice_data = {
"updated_timestamp": datetime.now(tz),
"data.gov.status": "已完成",
"data.gov.gov_status": "排程執行成功",
"data.gov.error_msg": "",
"data.gov.response.details": details,
}
透過以上程式碼,我們就可以取得自己的發票囉!
大功告成,到這邊為止,我們已經成功取得紙本電子發票、載具發票!